#eliminar archivos previos y limpiar la memoria del entornorm(list=ls());gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 600461 32.1 1372380 73.3 686445 36.7
Vcells 1103661 8.5 8388608 64.0 1876466 14.4
Código
#cargar datosload("_data/palestine.RData")#Definir el repositorio sobre el que instalar los paquetes desde Chileoptions(repos=structure(c(CRAN="https://cran.dcc.uchile.cl/"))) options(install.packages.check.source ="yes") # Chequea la fuente de los paquetesif(!require(pacman)){install.packages("pacman");require(pacman)}pacman::p_unlock(lib.loc =.libPaths()) #para no tener problemas reinstalando paquetes#obliga a desplegarlo en la versión de R 4.4.0if(Sys.info()["sysname"]=="Windows"){if (getRversion() !="4.4.0") { stop("Requiere versión de R 4.4.0. Actual: ", getRversion()) }}# Cargar o instalar paquetes necesariospacman::p_load( showtext, # Para cambiar la fuente de las letras ggplot2, # Para elaborar gráficos plotly, # Para elaborar gráficos interactivos magick, # Para mostrar imágenes knitr, # Para hacer tablas e interactuar con informes kableExtra, # Tablas más bonitas tidyverse, # Para manipular bases de datos rio, # Para importar y exportar bases de datos en distintos formatos psych, # Para explorar variables parallel, # Para paralelizar los procesos en la CPU doParallel, # Para paralelizar los procesos en la CPU glca, # Para llevar a cabo análisis de clases latentes DiagrammeR, # Para generar gráficos esquemáticos DiagrammeRsvg, # Para exportar gráficos rsvg, # Para transformar gráficos en formato .svg htmlwidgets, # Para visualizarlos en una presentación janitor, # Permite limpiar bases de datos, entre otras funciones tableone,install =TRUE# Instala los paquetes si no están presentes)#para comparacionesif(!require(chisq.posthoc.test)){devtools::install_github("ebbertd/chisq.posthoc.test")}
2 Describir datos
Código
# Crear un subconjunto de las variables de interésvariables_interes <-c("QKUW40_1", "QKUW40_2", "QKUW40_3", "QKUW40_4", "QKUW40_5", "QKUW40_90", "QKUW40_97", "QKUW40_98", "QKUW40_99", "Q1002", "Q1005")# Generar la tabla descriptivatabla_descriptiva <-CreateTableOne(vars = variables_interes, data = arabebarometro_selected, factorVars = variables_interes)# Mostrar la tabla en consolatabla_df <-as.data.frame(print(tabla_descriptiva, showAllLevels =TRUE, missing =TRUE))tabla_df <-cbind.data.frame(var=rownames(tabla_df), tabla_df)rownames(tabla_df)<-NULLtabla_df$var <-sub("\\.\\.\\.\\.", "", tabla_df$var)tabla_df$var <-ifelse(grepl("^X", tabla_df$var), "", tabla_df$var)
#Definimos el modelo: ítems manifiestos son explicados por una variable latentef_lca<-item(QKUW40_1, QKUW40_2, QKUW40_3, QKUW40_4, QKUW40_5, QKUW40_90, QKUW40_97, QKUW40_98, QKUW40_99) ~1#Semilla aleatoria para reproducibilidadseed<-2125#Opciones de la funciónverbose<- F # Seguir los resultados. TRUE= ver proceso de convergenciainit <-1e2# puntos iniciales sobre los cuales encontrar una solución global. sugiero 5e2 testiter <-5e1# Iteraciones para encontrar convergencia sugiero 5e2#Otros parámetros son : eps = 1e-6 (tolerancia)old <-Sys.time()lca02 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=2, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca03 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=3, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca04 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=4, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca05 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=5, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca06 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=6, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca07 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=7, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca08 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=8, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca09 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=9, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)lca10 <-glca(f_lca, data = arabebarometro_selected[,paste0("QKUW40_", c(1:5, 90, 97, 98, 99))], nclass=10, seed= seed, verbose= verbose, n.init= init, decreasing=T, maxiter=1e4, testiter = testiter)new_med<-(Sys.time())paste0("El modelo tomó ",round(new_med-old,2),"segundos hasta que todos los análisis fueron computados")
[1] "El modelo tomó 32.14segundos hasta que todos los análisis fueron computados"
Código
##| column: page#| fig-dpi: 600#para obtener otros índices de ajustegof<-gofglca(lca02, lca03, lca04, lca05, lca06, lca07, lca08, lca09, lca10, test ="chisq")#número total de clases latentes postuladasmax_classes<-nrow(gof$gtable)+1#para obtener índice BLRT= Evaluar si el modelo k presenta mejor ajuste que el k-1#número de iteraciones para bootstrap, se recomienda 5e2nboot=10bootlrt<-gofglca(lca02, lca03, lca04, lca05, lca06, lca07, lca08, lca09, lca10, test ="boot", nboot= nboot, seed=2125)manualcolors <-rev(c('gray20', 'gray50', 'gray80')) # Tres colores en escala de grisesmanual_linetypes <-rev(c('solid', 'dashed', 'dotted')) # Tres estilos de línealevels <-c("logLik", "Gsq", "AIC", "CAIC", "BIC", "entropy", "Res.Df")labels <-c('Log-Verosimilitud', 'Chi2', 'Criterio de Información\nde Akaike (AIC)', 'AIC Corregido', 'Criterio de Información\nBayesiano (BIC)', 'Entropía', 'Grados de libertad residuales')fig_lca_fit <-cbind.data.frame(rn =2:max_classes, gof$gtable) %>%data.frame() %>% dplyr::mutate_if(is.character, as.numeric) %>%# Convertir columnas de carácter a numérico#formatear la base de manera larga (es decir), cada fila es la combinación única de una probabilidad, pregunta y clase tidyr::pivot_longer(cols =-rn, names_to ="indices", values_to ="value", values_drop_na = F) %>%#dejar en formato factor los índices, para reconocerlos e identificarlos dplyr::mutate(indices =factor(indices, levels = levels, labels = labels)) %>%# Filtrar solo AIC y BIC dplyr::filter(grepl("(AIC|BIC)", indices, ignore.case =TRUE)) %>% dplyr::mutate(ModelIndex =factor(rn, levels =2:max_classes)) %>%ggplot(aes(x = ModelIndex, y = value, group = indices, color = indices, linetype = indices)) +geom_line(linewidth =1.5) +# Colores y estilos de línea personalizadosscale_color_manual(values = manualcolors) +scale_linetype_manual(values = manual_linetypes) +labs(x ="Número de clases", y ="Valor", color ="Medida", linetype ="Medida") +theme_bw()fig_lca_fit#Para exportar gráficoggsave("_figs/_fig2_comparison_glca.png",fig_lca_fit, dpi=600)
Índices de ajuste modelo clases latentes
Vemos un resumen de la salida del modelo con mejores índices de ajuste BIC.
Vemos la entropía usando glca_mejor_ajuste$gof$entropy 0.83. Bastante buena.
Ahora veremos los perfiles de las probabilidades de respuesta a los ítems condicionales a la pertenencia a una determinada clase.
Código
##| column: page#| fig-dpi: 600# Configuración inicial y preparación de datos# Extracción de parámetros rho del modelo GLCArho_glca <-do.call("bind_rows", glca_mejor_ajuste$param$rho$ALL) %>%t() %>%round(2) %>% data.table::data.table(keep.rownames =TRUE) %>% magrittr::set_colnames(c("variables", paste0("Class", 1:glca_mejor_ajuste$model$C))) %>% tidyr::separate(variables, into =c("var", "prob"), sep =".Y =")# Transformación de datos del modelolcmodel_glca <- rho_glca %>% tidyr::pivot_longer(cols =3:5,names_to ="class",values_to ="value" ) # Unión de etiquetas con probabilidades del modelolcmodel_glca <- lcmodel_glca %>% dplyr::mutate(pr =as.numeric(gsub("[^0-9.]+", "", prob))-1) %>% dplyr::mutate(etiqueta= dplyr::case_when(grepl("_1$", var) ~"01.Boicot\nempresas", grepl("_2$", var) ~"02.Seguir\nnoticias", grepl("_3$", var) ~"03.Actividades\nsolidaridad",grepl("_4$", var) ~"04.Difusión\nsolidaridad",grepl("_5$", var) ~"05.Donaciones\nmonetarias",grepl("_90$", var) ~"90.Otro\n(Especificar)",grepl("_97$", var) ~"97.No he tomado\nninguna acción",grepl("_98$", var) ~"98.No sabe",grepl("_99$", var) ~"99.Se niega\nresponder",TRUE~NA_character_# Para manejar valores no coincidentes ))# Generación de etiquetas para gráficoslcmodel_glca$text_label <-paste0("Etiqueta:", lcmodel_glca$etiqueta,"<br>Categoría:", lcmodel_glca$pr,"<br>%: ", scales::percent(lcmodel_glca$value))#Ordenamos las opciones por orden de apariciónlcmodel_glca$var <-factor(lcmodel_glca$var, levels =paste0("QKUW40_", c(1:5, 90, 97, 98, 99)))# Cálculo de porcentajes de clase, >.5 PROBABILIDAD DE PERTENENCIAglca_pop_perc_05 <- glca_mejor_ajuste$posterior$ALL %>% dplyr::mutate_all(~ifelse(. > .5, 1, 0)) %>% dplyr::mutate(final_05 = dplyr::case_when(`Class 1`==1~1, `Class 2`==1~2, `Class 3`==1~3 )) %>% janitor::tabyl(final_05) %>% dplyr::mutate(percent = scales::percent(percent, accuracy = .1),class =paste0("Clase", final_05),print =paste0(class, "\n(n=", n, ";", percent, ")") )# Cálculo de porcentajes de clase, >.7 PROBABILIDAD DE PERTENENCIAglca_pop_perc_07 <- glca_mejor_ajuste$posterior$ALL %>% dplyr::mutate_all(~ifelse(. > .7, 1, 0)) %>% dplyr::mutate(final_07 = dplyr::case_when(`Class 1`==1~1, `Class 2`==1~2, `Class 3`==1~3 )) %>% janitor::tabyl(final_07) %>% dplyr::mutate(percent = scales::percent(percent, accuracy = .1),class =paste0("Clase", final_07),print_07 =paste0(class, "[>.7 prob]","\n(n=", n, ";", percent, ")") ) %>%#sacamos sujetos no clasificados dplyr::filter(!is.na(final_07)) %>%#seleccionamos columnas de interés para unir y no generar redundancia dplyr::select(final_07, class, print_07)# Unión con datos transformadoslcmodel_glca <- lcmodel_glca %>% dplyr::mutate(class=gsub("Class","Clase",class)) %>%left_join(glca_pop_perc_05, by =c("class")) %>%left_join(glca_pop_perc_07, by =c("class")) %>% dplyr::select(-class) %>% dplyr::rename("class"="print") # Gráfico principalzp <-ggplot(dplyr::mutate(lcmodel_glca, class=gsub("\n","",class)), aes(x = var, y = value, fill =factor(pr), label = text_label)) +geom_bar(stat ="identity", position ="stack") +facet_grid(class ~ .) +scale_fill_brewer(type ="seq", palette ="Greys", na.value ="white") +theme_bw() +labs(y ="Porcentaje de probabilidad de respuesta",x ="",fill ="Categorías de\nRespuesta" ) +theme(axis.text.y =element_blank(),axis.ticks.y =element_blank(),panel.grid.major.y =element_blank(),axis.text.x =element_text(angle =30, hjust =1) ) +guides(fill =guide_legend(reverse =TRUE))# Exportación del gráfico y datos# ggplotly(zp, tooltip = c("text_label")) %>%# layout(xaxis = list(showticklabels = TRUE), height = 600, width = 1000)ggplotly(zp, tooltip =c("text_label")) %>%layout(legend =list(orientation ="h", # Leyenda horizontalx =0.5, # Centra horizontalmentey =-0.2# Mueve la leyenda debajo del gráfico ),xaxis =list(showticklabels =TRUE),height =700, # Ajusta la alturawidth =700, # Ajusta el anchomargin =list(l =100, r =50, t =50, b =150) # Márgenes para etiquetas y títulos )#EXPORTAMOS EL GRÁFICO NO-INTERACTIVOggsave("_figs/_fig4_LCA_patrones_respuesta.png", zp, dpi =600)
Probabilidades de respuesta esperada por cada categoría en cada ítem según Clase estimada
Código
#Exportar las tablas obtenidaslcmodel_glca %>%#excluimos columnas de procesos intermedios que pueden confundirnos dplyr::select(-any_of(c("text_label", "prob", "n", "percent", "final_05", "final_07"))) %>%#sacamos información redundante#utilizamos doble escape (\\) para sacar símbolos que pueden ser interpretados literalmente dplyr::mutate(print_07 =gsub("\\[>\\.7 prob\\]\\n", " ", print_07))%>% dplyr::mutate((across(c("etiqueta", "class"),~gsub("\n", " ",.))))%>%#renombramos columnas para mayor claridad dplyr::rename("Prob. de pertencer a clase [P>.5]"="class", "Prob. de pertencer a clase [P>.7]"="print_07") %>% { rio::export(.,"_output/variables_probabilidades_respuesta.xlsx") rio::export(.,"_output/variables_probabilidades_respuesta.csv") knitr::kable(., caption="Probabilidades de respuesta de cada clase y clasificaciones por según distintos criterios de clasificación por probabilidad posterior de pertenencia", escape=F) }
Probabilidades de respuesta de cada clase y clasificaciones por según distintos criterios de clasificación por probabilidad posterior de pertenencia
var
value
pr
etiqueta
Prob. de pertencer a clase [P>.5]
Prob. de pertencer a clase [P>.7]
QKUW40_1
1.00
0
01.Boicot empresas
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_1
0.14
0
01.Boicot empresas
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_1
0.04
0
01.Boicot empresas
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_1
0.00
1
01.Boicot empresas
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_1
0.86
1
01.Boicot empresas
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_1
0.96
1
01.Boicot empresas
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_2
1.00
0
02.Seguir noticias
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_2
0.57
0
02.Seguir noticias
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_2
0.10
0
02.Seguir noticias
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_2
0.00
1
02.Seguir noticias
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_2
0.43
1
02.Seguir noticias
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_2
0.90
1
02.Seguir noticias
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_3
1.00
0
03.Actividades solidaridad
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_3
0.91
0
03.Actividades solidaridad
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_3
0.28
0
03.Actividades solidaridad
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_3
0.00
1
03.Actividades solidaridad
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_3
0.09
1
03.Actividades solidaridad
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_3
0.72
1
03.Actividades solidaridad
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_4
1.00
0
04.Difusión solidaridad
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_4
0.75
0
04.Difusión solidaridad
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_4
0.12
0
04.Difusión solidaridad
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_4
0.00
1
04.Difusión solidaridad
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_4
0.25
1
04.Difusión solidaridad
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_4
0.88
1
04.Difusión solidaridad
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_5
0.97
0
05.Donaciones monetarias
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_5
0.40
0
05.Donaciones monetarias
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_5
0.11
0
05.Donaciones monetarias
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_5
0.03
1
05.Donaciones monetarias
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_5
0.60
1
05.Donaciones monetarias
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_5
0.89
1
05.Donaciones monetarias
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_90
0.90
0
90.Otro (Especificar)
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_90
1.00
0
90.Otro (Especificar)
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_90
0.99
0
90.Otro (Especificar)
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_90
0.10
1
90.Otro (Especificar)
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_90
0.00
1
90.Otro (Especificar)
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_90
0.01
1
90.Otro (Especificar)
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_97
0.51
0
97.No he tomado ninguna acción
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_97
1.00
0
97.No he tomado ninguna acción
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_97
0.99
0
97.No he tomado ninguna acción
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_97
0.49
1
97.No he tomado ninguna acción
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_97
0.00
1
97.No he tomado ninguna acción
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_97
0.01
1
97.No he tomado ninguna acción
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_98
0.94
0
98.No sabe
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_98
1.00
0
98.No sabe
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_98
1.00
0
98.No sabe
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_98
0.06
1
98.No sabe
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_98
0.00
1
98.No sabe
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_98
0.00
1
98.No sabe
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_99
0.68
0
99.Se niega responder
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_99
1.00
0
99.Se niega responder
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_99
0.98
0
99.Se niega responder
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
QKUW40_99
0.32
1
99.Se niega responder
Clase1 (n=64;5.3%)
Clase1 (n=64;5.3%)
QKUW40_99
0.00
1
99.Se niega responder
Clase2 (n=946;78.2%)
Clase2 (n=856;70.7%)
QKUW40_99
0.02
1
99.Se niega responder
Clase3 (n=200;16.5%)
Clase3 (n=152;12.6%)
A partir del gráfico anterior y la tabla, podemos interpretar las clases:
Clase 1= Describe a personas que no han tomado ninguna acción concreta, no saben o no responden.
Clase 2= Describe a personas que han actuado de forma individual e internalizante.
Clase 3= Describe a personas que han actuado de muchas formas, incluidas acciones colectivas, mobilizaciones y difusión.
De ahí uno podría hacer interpretaciones en contraste con teorías de movimientos sociales, advocacy groups, etc. Por ejemplo, grupos que reflejan actitudes de desmovilización o desconexión, grupos de acciones individuales, simbólicas o de bajo costo (“participación selectiva” / free-riding), y un grupo cuya movilización tiende a ser colectiva, incorporando recursos y redes con mayor nivel de compromiso y participación activa.
Clasificación por valores superiores a 0,7 en probabilidad vs. 0,5
Clases
Clase 1
Clase 2
Clase 3
No clasificado
1
64
0
0
0
2
0
856
0
90
3
0
0
152
48
Código
posterior_glca_07 %>%rowwise() %>% dplyr::mutate(count_ones =sum(c_across(starts_with("Class")) ==1)) %>%ungroup() %>% janitor::tabyl(final_07,count_ones) %>% knitr::kable(col.names=c("Clasificación por valores superiores a 0,7 en probabilidad", "0", "1"), caption="Pruebas por probabilidades de clasificación posterior")
Pruebas por probabilidades de clasificación posterior
Clasificación por valores superiores a 0,7 en probabilidad
0
1
1
0
64
2
0
856
3
0
152
NA
138
0
Vemos que hay algunas observaciones que si clasificáramos por un criterio más estricto de pertenencia (al menos 49% de la variabilidad es explicada por la clase) no alcanzan a pertenecer a una determinada clase.
5 Caracterización/ Comparación con otras variables
Podría decirse que hombres empleados (intercepto) tienen mayores chances de pertenecer a la clase 1 vs. la 3 (OR= 11.3), y 2 vs. 3 (OR= 27.7)
Encontrarse inactivo (retirado, dueñ@ de casa o desempleado y buscando trabajo vs. empleados) se asocia a menores chances de pertenecer a la clase 1 vs. la 3.
No hay evidencia de una asociación entre pertenecer a una clase y el sexo.
Tener en cuenta la escasez de observaciones para algunas categorías de respuesta.
Código
# Crear un data frame combinado con ocupación, clasificación y sexodata_combined <-cbind.data.frame(ocupacion = arabebarometro_selected$Q1005,clasif_05 = posterior_glca_05$final_05,sexo = arabebarometro_selected$Q1002) %>%# Reemplazar valores en la variable 'ocupacion'mutate(ocupacion =case_when( ocupacion %in%c("1", "2") ~"activa", ocupacion =="5"~"estudiante",TRUE~"inactiva" ) )# Crear tabla de frecuencias cruzadas con xtabstabla_cruzada <-xtabs(~ clasif_05 + ocupacion + sexo, data = data_combined)
6 Información de la sesión
Código
#guardamos la información generadasave.image("_data/palestine2.RData")#vemos desde donde se producen las libreríasmessage(paste0("R library: ", Sys.getenv("R_LIBS_USER")))
R library: C:\Users\andre\AppData\Local/R/win-library/4.4
#plataforma donde se desplegó el códigodevtools::session_info()$platform
setting value
version R version 4.4.0 (2024-04-24 ucrt)
os Windows 11 x64 (build 26100)
system x86_64, mingw32
ui RTerm
language (EN)
collate Spanish_Chile.utf8
ctype Spanish_Chile.utf8
tz America/Santiago
date 2024-12-31
pandoc 3.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)